package com.wugui.datax.admin.controller;

import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wugui.datax.admin.util.PageUtils;
import com.wugui.datax.admin.util.ServletUtils;

import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 基础参数辅助类
 *
 * @author zhouhongfa@gz-yibo.com
 * @version 1.0
 * @since 2019/5/15
 */
@Slf4j
public class BaseForm {
	/**
	 * 查询参数对象
	 */
	protected Map<String, Object> values = new LinkedHashMap<>();

	/**
	 * 当前页码
	 */
	private Long current = 1L;

	/**
	 * 页大小
	 */
	private Long size = 10L;

	/**
	 * 构造方法
	 */
	public BaseForm() {
		try {
			HttpServletRequest request = ServletUtils.getRequest();
			Enumeration<String> params = request.getParameterNames();
			while (params.hasMoreElements()) {
				String name = params.nextElement();
				String value = StrUtil.trim(request.getParameter(name));
				this.set(name, URLDecoder.decode(value, "UTF-8"));
			}
			this.parsePagingQueryParams();
		} catch (Exception e) {
			e.printStackTrace();
			log.error("BaseControlForm initialize parameters setting error：" + e);
		}
	}

	/**
	 * 获取页码
	 *
	 * @return
	 */
	public Long getPageNo() {
		String pageNum = StrUtil.toString(this.get("current"));
		if (!StrUtil.isEmpty(pageNum) && NumberUtil.isNumber(pageNum)) {
			this.current = Long.parseLong(pageNum);
		}
		return this.current;
	}

	/**
	 * 获取页大小
	 *
	 * @return
	 */
	public Long getPageSize() {
		String pageSize = StrUtil.toString(this.get("size"));

		if (StrUtil.isNotEmpty(pageSize) && NumberUtil.isNumber(pageSize) && !"null".equalsIgnoreCase(pageSize)) {
			this.size = Long.parseLong(pageSize);
		}
		return this.size;
	}

	/**
	 * 获得参数信息对象
	 *
	 * @return
	 */
	public Map<String, Object> getParameters() {
		return values;
	}

	/**
	 * 根据key获取values中的值
	 *
	 * @param name
	 * @return
	 */
	public Object get(String name) {
		if (values == null) {
			values = new LinkedHashMap<>();
			return null;
		}
		return this.values.get(name);
	}

	/**
	 * 根据key获取values中String类型值
	 *
	 * @param key
	 * @return String
	 */
	public String getString(String key) {
		return StrUtil.toString(get(key));
	}

	/**
	 * 获取排序字段
	 *
	 * @return
	 */
	public String getSort() {
		return StrUtil.toString(this.values.get("sort"));
	}

	/**
	 * 获取排序
	 *
	 * @return
	 */
	public String getOrder() {
		return StrUtil.toString(this.values.get("order"));
	}

	/**
	 * 获取排序
	 *
	 * @return
	 */
	public String getOrderby() {
		return StrUtil.toString(this.values.get("orderby"));
	}

	/**
	 * 解析出mybatis plus分页查询参数
	 */
	public Page getPlusPagingQueryEntity() {
		Page page = new Page();
		// 如果无current，默认返回1000条数据
		page.setCurrent(this.getPageNo());
		page.setSize(this.getPageSize());
		if (ObjectUtil.isNotNull(this.get("ifCount"))) {
			page.setSearchCount(BooleanUtil.toBoolean(this.getString("ifCount")));
		} else {
			// 默认给true
			page.setSearchCount(true);
		}
		return page;
	}

	/**
	 * 解析分页排序参数（pageHelper）
	 */
	public void parsePagingQueryParams() {
		// 排序字段解析
		String orderBy = StrUtil.toString(this.get("orderby")).trim();
		String sortName = StrUtil.toString(this.get("sort")).trim();
		String sortOrder = StrUtil.toString(this.get("order")).trim().toLowerCase();

		if (StrUtil.isEmpty(orderBy) && !StrUtil.isEmpty(sortName)) {
			if (!sortOrder.equals("asc") && !sortOrder.equals("desc")) {
				sortOrder = "asc";
			}
			this.set("orderby", sortName + " " + sortOrder);
		}
	}

	/**
	 * 设置参数
	 *
	 * @param name  参数名称
	 * @param value 参数值
	 */
	public void set(String name, Object value) {
		if (ObjectUtil.isNotNull(value)) {
			this.values.put(name, value);
		}
	}

	/**
	 * 移除参数
	 *
	 * @param name
	 */
	public void remove(String name) {
		this.values.remove(name);
	}

	/**
	 * 清除所有参数
	 */
	public void clear() {
		if (values != null) {
			values.clear();
		}
	}

	/**
	 * 自定义查询组装
	 *
	 * @param map
	 * @return
	 */
	protected QueryWrapper<?> pageQueryWrapperCustom(Map<String, Object> map, QueryWrapper<?> queryWrapper) {
		// mybatis plus 分页相关的参数
		Map<String, Object> pageParams = PageUtils.filterPageParams(map);
		// 过滤空值，分页查询相关的参数
		Map<String, Object> colQueryMap = PageUtils.filterColumnQueryParams(map);
		// 排序 操作
		pageParams.forEach((k, v) -> {
			switch (k) {
			case "ascs":
				queryWrapper.orderByAsc(StrUtil.toUnderlineCase(StrUtil.toString(v)));
				break;
			case "descs":
				queryWrapper.orderByDesc(StrUtil.toUnderlineCase(StrUtil.toString(v)));
				break;
			}
		});

		// 遍历进行字段查询条件组装
		colQueryMap.forEach((k, v) -> {
			switch (k) {
			case "pluginName":
			case "datasourceName":
				queryWrapper.like(StrUtil.toUnderlineCase(k), v);
				break;
			default:
				queryWrapper.eq(StrUtil.toUnderlineCase(k), v);
			}
		});

		return queryWrapper;
	}

}